package net.ib.mtalk.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * MD5 해싱을 위한 지원
 * @author Arngard
 */
public final class MD5 {
	
    private static MessageDigest md;

    static {	// 정적 초기화
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
        	MTalkLogWriter.e(e);
        }
    }

	private static byte[] digest(byte[] msg) {
        md.reset();
        return md.digest(msg);
    }

	/**
	 * @param str 인코딩할 문자열
	 * @return 인코딩된 바이트
	 */
	public static byte[] encode(String str) {
        if (str == null) {
            return null;
        }

        return encode(str.getBytes());
    }

	/**
	 * @param bytes 인코딩할 바이트
	 * @return 인코딩된 바이트
	 */
    public static byte[] encode(byte[] bytes) {
        if (bytes == null) {
            return null;
        }

        return digest(bytes);
    }

	/**
	 * 대소문자 처리는 안 되어 있다.
	 * @param str 인코딩할 문자열
	 * @return 인코딩된 문자열
	 */
	public static String encodeToString(String str) {
        if (str == null) {
            return null;
        }

		return encodeToString(str.getBytes());
	}

	/**
	 * 대소문자 처리는 안 되어 있다.
	 * @param bytes 인코딩할 바이트
	 * @return 인코딩된 문자열
	 */
	public static String encodeToString(byte[] bytes) {
        if (bytes == null) {
            return null;
        }

        StringBuffer sb = new StringBuffer();

		byte[] hashCode = digest(bytes);
		for (int i = 0; i < hashCode.length; ++i) {
			sb.append(String.format("%02x", 0xff&(char)hashCode[i]));
		}

		return sb.toString();
	}
	
}
